#ifndef _APP_H_
#define _APP_H_

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include <stdio.h>
#include "user_pwm.h"
#include <string.h>

#include "esp_timer.h"

#include "tm1638.h"
#include "ble_app.h"
#include "user_wifi.h"
#include "user_adc.h"
#include "user_uart.h"
#include "user_rmt.h"
#include "user_time.h"

#include "cJSON.h"


#define MODE_DEFINE 1	// 默认模式1 
#define TIME_DEFINE 90	// 默认30分钟时间

#define TIME_FLASH_DEFINE 10	// 无操作设定时间后恢复正常状态

#define UART_LEN_MAX 50	// 串口数据最大长度
#define MODE_NUM_MAX 4	// 当前最大模式

#define CODE_VERSION "V1.0.2"	// 定义版本号


#define Heat_Valu_NULL	100		// 温度传感器阈值，低于这个参数，为未连接温度探头。根据默认参数设置加热强度。 
#define Heat_Value_L1	1800	// 等级一的温度采样值标准
#define Heat_Value_L2	2000	// 等级二的温度采样值标准
#define Heat_Value_L3	2200	// 等级三的温度采样值标准

#define Heat_Value_NULL_L1	100	// 未连接传感器情况下，等级1的驱动电压
#define Heat_Value_NULL_L2	150	// 未连接传感器情况下，等级2的驱动电压
#define Heat_Value_NULL_L3	200	// 未连接传感器情况下，等级3的驱动电压


#define HAND_KEY_ADD           GPIO_NUM_32               //手柄按键定义
#define HAND_KEY_SUB           GPIO_NUM_35               //手柄按键定义

#define HAND_GET_KEY_ADD          gpio_get_level(HAND_KEY_ADD)    // 读取数据引脚
#define HAND_GET_KEY_SUB          gpio_get_level(HAND_KEY_SUB)    // 读取数据引脚

typedef enum {
    Arg_Mode = 0x0,   
    Arg_Time , 
	Arg_Streng ,
	Arg_Heat , 
	Arg_None,   
} eArg_Vaule;

typedef struct {

	uint8_t flag;	
	bool System_Power;	
	bool System_Ble_Connect;	

	bool Led_Ble_Flag;	// BLE灯亮灭
	bool Led_Wifi_Flag;	// WIFI灯亮灭
	bool Led_Heat_Flag;	// HERT灯亮灭
	bool Led_Time_Flag;	// TIME灯亮灭
	bool Led_Start_Flag;	// STOP灯亮灭

	bool Led_Time_Num_Flag;	// 时间调整灯亮灭
	bool Led_Mode_Num_Flag;	// 模式调整灯亮灭
	bool Led_Streng_Num_Flag;	// 强度调整灯亮灭
	bool Led_Heat_Num_Flag;	// 强度调整灯亮灭
	bool Led_Minute_Flag;		// 分钟灯亮灭

	bool Led_Flash ; // LED闪烁标记位
	//bool Led_Display_Change_Flag;	// 有显示参数发生变更

	bool Key_Sustain_Flag;	// 按键长按标记

	//bool Ble_Get_BufferData_Flag;	// 获取到BLE数据标记
	bool Ble_Send_Data_Flag;	// 有数据需要发送标记

	bool Ble_SetDataRate_Flag;	// 连续数据发送标记位

	//bool Adc_DMA_Status_FLag;	// 当前ADC的工作状态
	//bool Electrode_Sheet_Flag;	// 电极片粘贴状态  0 ： 未粘贴  1 ：粘贴
} tSys_Flag;

typedef struct {

	char  Ble_Data_Buff[512];	
	char  Ble_SendData_Buff[512];	
	char  Uart_Data_Buff[UART_LEN_MAX];	
	char  Ble_MAC[6];	
	char  BLE_Device_Name[32];
	
	
	int8_t Mode_Value;	// 当前选择模式  10个模式
	int32_t Time_Value;	// 当前时间		0~5940 秒 = 99分钟 * 60秒
	int16_t Set_Value;	// 设定时间		0~99分钟
	int8_t Streng_Value;	// 当前强度值	0~99档
	int8_t Heat_Value;	// 当前加热强度		0~3档
	int32_t Current_Value;	// 当前电流采集强度值	

	int8_t Argument_Value;	// 当前选择需要调整的参数值

	uint16_t Ble_Send_Rate;	// BLE数据的刷新速度

	uint32_t Led_Flash_Time ; // LED闪烁标时间

	uint32_t Key_Vaule;	// 系统按键值
	int Yz_Timer_Cont ;	// 输出调制信号占空比的阈值 0~Yz_Timer_Cont_ALL
	int Yz_Timer_Cont_ALL ;	// 输出调制信号占空比的最大值

	int Pwm_Amp_Num ;	// 占空比放大倍数

	int Time1_Cont;	// 定时器1的计数值

	int Temp_Adc_Value;	// 温度采集脚的ADC值

	int32_t RealTIme_Frequency; 	// 当前工作的频率
} tSys_Status;


void App_Task(void* param);
void us_delay(uint32_t us);
void Process_Key(uint32_t key_value , bool sustain_flag);
void Power_ON_Process(void);
void Power_OFF_Process(void);
void Uart_Process_Data( char * buff );
void Work_Start_Process(void);
void Work_Stop_Process(void);
void Change_Mode_Process(char mode);
int adc_to_temperature(int adc_value);



#endif /* _APP_H_ */